package com.zy.project2_aop_base.jdkproxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @program: mavenTest153
 * @description:  自定义的增强处理器
 * @author: zy
 * @create: 2025-07-15 11:44
 */
public class MyAdviceInvocationHandler implements InvocationHandler {

    private Object target;  //目标对象

    public MyAdviceInvocationHandler(Object target) {
        this.target = target;
    }

    //通过目标来生产代理对象
    public Object getProxy(){
        return Proxy.newProxyInstance(
                MyAdviceInvocationHandler.class.getClassLoader(),
                target.getClass().getInterfaces(),  //目标类所有的接口都 可以被代理
                this
        );
    }

    //invoke激活方法，回诘方法， 当客户端调用代理对象的方法时，会自动调用invoke方法
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //前置增强
        if(  method.getName().startsWith("update")|| method.getName().startsWith("save") ){  // @Pointcut("execution(* com.zy.project1.biz.*.find*(..))")
           //@Before
            checkRight();
        }
        //调用目标方法
        Object returnValue=method.invoke(target,args);


        if(  method.getName().startsWith("show")|| method.getName().startsWith("find") ){  // @Pointcut("execution(* com.zy.project1.biz.*.find*(..))")
            //后置增强
            //@After
            log();
        }


        return returnValue;
    }

    public void checkRight(){
        System.out.println("权限验证...");
    }

    public void log(){
        System.out.println("记录日志...");
    }
}
